package com.cskaoyan._06operate._04copy;

import java.util.Arrays;

/**
 * @description:
 * @author: 景天
 * @date: 2023/2/1 17:24
 **/
/*
数组拷贝
数组的长度是不可以改变的，
所以如果想要实现数组元素真正意义上的删除和新增，一般需要使用数组的拷贝。
大致思路是，创建一个新数组,然后拷贝赋值：

1. 首先需要明确新数组的长度，初始化这个新数组。
2. 然后遍历原先的数组，过滤掉（或者新增）一些元素，给新数组赋值。
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 5, 5};

        // 测试
        //int[] newArray = realAddElementToArray(arr, 6);
        //System.out.println(Arrays.toString(newArray));

        //
        //int[] newArray = realAddElementToArray2(arr, 7);
        //System.out.println(Arrays.toString(newArray));

        int[] newArray = realDelElementToArray(arr, 5);
        System.out.println(Arrays.toString(newArray));

    }

    /*
    向数组中添加新的元素的方法
    分析:
        参数:原来的数组int[] , int的新元素值
        返回值:int[]
     */
    public static int[] realAddElementToArray(int[] oldArray, int value) {
        // 计算一下新数组的长度
        // 创建新数组
        int[] newArray = new int[oldArray.length + 1];
        // 遍历原来的数组
        for (int i = 0; i < oldArray.length; i++) {
            // 循环中,把原数组的元素依次赋值到新数组中
            newArray[i] = oldArray[i];
        }
        // 循环结束 把新元素值插入到新数组中的最后一个位置
        newArray[newArray.length - 1] = value;
        // 最终要返回1个新数组,并且新的元素已经加入到新的数组里了
        return newArray;
    }

    // 使用增强for
    public static int[] realAddElementToArray2(int[] oldArray, int value) {
        // 创建新数组
        int[] newArray = new int[oldArray.length + 1];
        // 定义一个index,初始值为0
        int index = 0;
        // 使用增强for进行数组遍历
        for (int element : oldArray) {
            // 循环里面, 把原来的数组元素依次进行赋值操作
            newArray[index] = element;
            // index++
            index++;
        }
        // 循环结束了 , 把新的元素写入新的数组
        newArray[index] = value;

        // 返回新的数组
        return newArray;
    }

    /*
    删除数组元素,要求相同的元素都删除
    分析:
        参数:原来的数组int[] , 要被删的元素值int
        返回值: 新的数组
     */

    public static int[] realDelElementToArray(int[] oldArray, int value) {
        // 计算一下要删多少个元素
        // 定义一个计数器,用来统计重复的个数
        int count = 0;
        for (int e : oldArray) {
            // 判断是否跟要删的元素相同
            if (e == value) {
                // 计数器+1
                count++;
            }
        }

        // 创建新的数组
        int[] newArray = new int[oldArray.length - count];

        // 遍历数组
        int index = 0;
        for (int element : oldArray) {
            // 循环里,进行判断
            // 再去赋值操作
            if (element == value) {
                continue;
            }
            newArray[index] = element;
            index++;
        }

        // 循环结束

        // 返回新的数组
        return newArray;
    }

}
